/*
Decorator  修饰器
基本概念：修饰器是一个函数用来修改类的行为，是一个函数，用来修改类的行为；修改类的行为  通过修饰器可以扩展类的功能，只在类的范畴里面有用
*/

{
    //用  babel-plugin-transform-decorators-legacy 打补丁
    //定义一个函数  修改的类的本身，修改类的名称，修改类的属性的描述
    let readOnly=function(target,name,descriptor){
      descriptor.writable=false;
      return descriptor
    };
    class Test{
      @readOnly
      time(){
        return '2017-9-25'
      }
    }

    let test=new Test();
    // test.time=function(){
    //   console.log('resect','2017-9-26');
    // }
    console.log(test.time());// Cannot assign to read only property 'time' of object '#<Test>'
}

{
  //有一个常规的库包含一些修饰器，js库：core-decorators;
  let typeName=function(target,name,descriptor){
      target.myname='yuanmanxue';
  };
  //修饰器在类的外面用target来表是类的一个静态属性和方法
  @typeName
  class Test{
  }
console.log('修饰器来创造类的静态属性',Test.myname);
}

{
  //日志
  let log=(type)=>{
    return function(target,name,descriptor){
      let src_method=descriptor.value;
      descriptor.value=(...arg)=>{
        src_method.apply(target,arg);
        console.info(`log ${type}`);
      }
    }
  }

  class AD{
    @log('show')
    show(){
      console.log(`ad is show`)
    }
    @log('click')
    click(){
      console.info(`ad is click`);
    };
  }
  let ad=new AD()
  ad.show();
  ad.click();
}
